﻿using System;
using System.Windows.Forms;

namespace clasesBase
{
    public static class FiltroBindingSource
    {
        private static string obtenerCadenaFiltros(string columna, string valorFiltro, char tipoDeDato)
        {
            string cadenaFiltro = "";
            switch (tipoDeDato)
            {
                case TipoDatoColumna.NUMERICO:
                case TipoDatoColumna.FECHA:
                    cadenaFiltro = string.Format("{0} = '{1}'", columna, valorFiltro);
                    break;

                case TipoDatoColumna.CADENA:
                    cadenaFiltro = string.Format("{0} LIKE '%{1}%'", columna, valorFiltro);
                    break;

                case TipoDatoColumna.HASTA_FECHA:
                    cadenaFiltro = string.Format("{0} <= '{1}'", columna, valorFiltro);
                    break;

                case TipoDatoColumna.DESDE_FECHA:
                    cadenaFiltro = string.Format("{0} >= '{1}'", columna, valorFiltro);
                    break;

                default:
                    cadenaFiltro = string.Format("{0} = '{1}'", columna, valorFiltro);
                    break;
            }

            return cadenaFiltro;
        }

        private static string filtrarDatos(BindingSource datos, string filtro)
        {
            string error = "";

            try
            {
                datos.Filter = filtro;
            }
            catch (Exception exc)
            {
                error = "El valor ingresado para la búsqueda no es válido. " + exc.Message;
            }

            return error;
        }

        public static string aplicarFiltro(BindingSource datos, string columna, string valorFiltro, char tipoDeDato)
        {
            string error = "";
            if (valorFiltro != "" && columna != "")
            {
                string cadenaFiltros = obtenerCadenaFiltros(columna, valorFiltro, tipoDeDato);
                filtrarDatos(datos, cadenaFiltros);
            }
            else error = "Debe elegir una columna y especificar un valor de filtro antes de continuar";

            return error;
        }

        public static string aplicarFiltrosVarios(BindingSource datos, string[] columnas, string[] valoresFiltro, char[] tiposDeDatos)
        {
            string error = "";

            if (columnas.Length == valoresFiltro.Length && columnas.Length == tiposDeDatos.Length)
            {
                int cantFiltros = columnas.Length;
                string columna = "", valorFiltro = "";
                char tipoDeDato = ' ';
                string cadenaFiltros = "";
                for (int indice = 0; indice < cantFiltros; indice++)
                {
                    columna = columnas[indice];
                    valorFiltro = valoresFiltro[indice];
                    tipoDeDato = tiposDeDatos[indice];
                    cadenaFiltros += (cadenaFiltros.Trim() == "" ? "" : " and ") + obtenerCadenaFiltros(columna, valorFiltro, tipoDeDato);
                }

                error = filtrarDatos(datos, cadenaFiltros);
            }

            return error;
        }

        public static void mostrarTodo(BindingSource datos)
        {
            datos.RemoveFilter();
        }
    }
}